過濾器模式
過濾器模式(Filter Pattern),又叫標準模式(Criteria Pattern),是一種結構型模式,通過結合多個標準來獲得單一標準。
這種設計模式允許開發(fā)人員使用不同的標準來過濾一組對象,通過邏輯運算以解耦的方式把它們連接起來。
優(yōu)缺點
優(yōu)點:
1、體現(xiàn)了各功能模塊的“黑盤”特性及高內(nèi)聚、低耦合的特點。
2、可以將整個系統(tǒng)的輸入,輸出行為看成是多個過濾器行為的簡單合成。
3、支持軟件功能模塊的重用。
4、便于系統(tǒng)維護:新的過濾器可以添加到現(xiàn)有系統(tǒng)中來,舊的可以由改進的過濾器替換。
5、支持某些特定的分析,如吞吐量計算、死鎖檢測等。
6、支持并行操作,每個過濾器可以作為一個單獨的任務完成。
缺點:
1、通常導致系統(tǒng)處理過程的成批操作。
2、需要設計者協(xié)調(diào)兩個相對獨立但又存在關系的數(shù)據(jù)流。
3、可能需要每個過濾器自己完成數(shù)據(jù)解析和合成工作(如加密和解密),從而導致系統(tǒng)性能下降,并增加了過濾器具體實現(xiàn)的復雜性。
注意事項
1、構建過濾規(guī)則時不要太繁瑣。
2、注意區(qū)分過濾和攔截的功能差異。
代碼實現(xiàn)
person.h
構建類 Person,可輸出自己的屬性,判斷是否在一個數(shù)組中
#include <string>
#include <vector>
#include <iostream>
using namespace std;
?
class Person
{
public:
? ? Person(string name, string gender, int age) : name(name), gender(gender), age(age) {}
?
? ? void printf()
? ? {
? ? ? ? cout << "student name: " + name +
? ? ? ? ? ? ? ? ", gender: " + gender +
? ? ? ? ? ? ? ? ", age: " + std::to_string(age) << endl;
? ? }
?
? ? bool judVec(std::vector<Person*> vec)
? ? {
? ? ? ? auto iter = std::find(std::begin(vec), std::end(vec), this);
? ? ? ? return (iter == std::end(vec));
? ? }
?
? ? string getName() { return this->name; }
?
? ? string getGender() { return this->gender; }
?
? ? int getAge() { return this->age; }
?
private:
? ? string name;
? ? string gender;
? ? int age;
};
interface.h
創(chuàng)建抽象類 - 過濾器;創(chuàng)建實體類 - 過濾器、男性過濾器、女性過濾器、年齡過濾器
男性和年齡過濾器、女性或年齡過濾器
#include "person.h"
#include <algorithm>
?
class Criteria ?//基類-過濾器
{
public:
? ? Criteria() {}
? ? virtual ~Criteria() {}
?
? ? virtual std::vector<Person *> filter(std::vector<Person *> vector) = 0;
};
?
class MaleCriteria: public Criteria //子類-男性過濾器
{
public:
? ? std::vector<Person *> filter(std::vector<Person *> vector)
? ? {
? ? ? ? std::vector<Person *> result;
?
? ? ? ? for(size_t i = 0; i < vector.size(); i++)
? ? ? ? {
? ? ? ? ? ? if(vector.at(i)->getGender() == "male")
? ? ? ? ? ? {
? ? ? ? ? ? ? ? result.push_back(vector.at(i));
? ? ? ? ? ? }
? ? ? ? }
?
? ? ? ? return result;
? ? }
};
?
class FemaleCriteria: public Criteria ? //子類-女性過濾器
{
public:
? ? std::vector<Person *> filter(std::vector<Person *> vector)
? ? {
? ? ? ? std::vector<Person *> result;
?
? ? ? ? for(size_t i = 0; i < vector.size(); i++)
? ? ? ? {
? ? ? ? ? ? if(vector.at(i)->getGender() == "female")
? ? ? ? ? ? {
? ? ? ? ? ? ? ? result.push_back(vector.at(i));
? ? ? ? ? ? }
? ? ? ? }
?
? ? ? ? return result;
? ? }
};
?
class AgeCriteria: public Criteria ?//子類-年齡過濾器
{
public:
? ? std::vector<Person *> filter(std::vector<Person *> vector)
? ? {
? ? ? ? std::vector<Person *> result;
?
? ? ? ? for(size_t i = 0; i < vector.size(); i++)
? ? ? ? {
? ? ? ? ? ? if(vector.at(i)->getAge() > 18) {
? ? ? ? ? ? ? ? result.push_back(vector.at(i));
? ? ? ? ? ? }
? ? ? ? }
?
? ? ? ? return result;
? ? }
};
?
class AndCriteria: public Criteria ?//子類-與 && 過濾器
{
public:
? ? AndCriteria(Criteria *firstCriteria, Criteria *secondCriteria): firstCriteria(firstCriteria), secondCriteria(secondCriteria) {}
?
? ? std::vector<Person *> filter(std::vector<Person *> vector)
? ? {
? ? ? ? std::vector<Person *> firstvector = firstCriteria->filter(vector);
? ? ? ? return secondCriteria->filter(firstvector);
? ? }
?
private:
? ? Criteria *firstCriteria;
? ? Criteria *secondCriteria;
};
?
class OrCriteria: public Criteria ? //子類- 或 || 過濾器
{
public:
? ? OrCriteria(Criteria *firstCriteria, Criteria *secondCriteria) : firstCriteria(firstCriteria), secondCriteria(secondCriteria) {}
?
? ? std::vector<Person *> filter(std::vector<Person *> vector)
? ? {
? ? ? ? std::vector<Person *> firstvector = firstCriteria->filter(vector);
? ? ? ? std::vector<Person *> secondvector = secondCriteria->filter(vector);
?
? ? ? ? for(auto it: firstvector)
? ? ? ? {
? ? ? ? ? ? if (it->judVec(secondvector))
? ? ? ? ? ? {
? ? ? ? ? ? ? ? secondvector.push_back(it);
? ? ? ? ? ? }
? ? ? ? }
?
? ? ? ? return secondvector;
? ? }
?
private:
? ? Criteria *firstCriteria;
? ? Criteria *secondCriteria;
};
-
?